-- Copyright 2013 Galois, Inc.
-- This software is distributed under a standard, three-clause BSD license.
-- Please see the file LICENSE, distributed with this software, for specific
-- terms and conditions.
-- |Error codes / exceptions for various HaLVM functions.
module Hypervisor.ErrorCodes(ErrorCode(..), GrantErrorCode(..)) where

import Control.Exception
import Data.Typeable
import GHC.Generics

-- |Error codes returned from hypervisor calls. These errors are either returned
-- directly or thrown as an exception.
--
-- Xen takes this directly from linux  @\/usr\/include\/asm\/errno.h@).
-- Only a small subset of these codes are actually used by xen (but there
-- is no documentation as to which ones these are).
data ErrorCode =
    EOK             -- ^ (not used; just to get enum aligned right)
  | EPERM           -- ^ Operation not permitted
  | ENOENT          -- ^ No such file or directory
  | ESRCH           -- ^ No such process
  | EINTR           -- ^ Interrupted system call
  | EIO             -- ^ IO error
  | ENXIO           -- ^ No such device or address
  | E2BIG           -- ^ Argument list too long
  | ENOEXEC         -- ^ Exec format error
  | EBADF           -- ^ Bad file number
  | ECHILD          -- ^ No child processes
  | EAGAIN          -- ^ Try again
  | ENOMEM          -- ^ Out of memory
  | EACCES          -- ^ Permission denied
  | EFAULT          -- ^ Bad address
  | ENOTBLK         -- ^ Block device required
  | EBUSY           -- ^ Device or resource busy
  | EEXIST          -- ^ File exists
  | EXDEV           -- ^ Cross-device link
  | ENODEV          -- ^ No such device
  | ENOTDIR         -- ^ Not a directory
  | EISDIR          -- ^ Is a directory
  | EINVAL          -- ^ Invalid argument
  | ENFILE          -- ^ File table overflow
  | EMFILE          -- ^ Too many open files
  | ENOTTY          -- ^ Not a typewriter
  | ETXTBSY         -- ^ Text file busy
  | EFBIG           -- ^ File too large
  | ENOSPC          -- ^ No space left on device
  | ESPIPE          -- ^ Illegal seek
  | EROFS           -- ^ Read-only file system
  | EMLINK          -- ^ Too many links
  | EPIPE           -- ^ Broken pipe
  | EDOM            -- ^ Math argument out of domain of func
  | ERANGE          -- ^ Math result not representable
  | EDEADLK         -- ^ Resource deadlock would occur
  | ENAMETOOLONG    -- ^ File name too long
  | ENOLCK          -- ^ No record locks available
  | ENOSYS          -- ^ Function not implemented
  | ENOTEMPTY       -- ^ Directory not empty
  | ELOOP           -- ^ Too many symbolic links encountered
  | EWOULDBLOCK     -- ^ Operation would block (not used; try EAGAIN)
  | ENOMSG          -- ^ No message of desired type
  | EIDRM           -- ^ Identifier removed
  | ECHRNG          -- ^ Channel number out of range
  | EL2NSYNC        -- ^ Level 2 not synchronized
  | EL3HLT          -- ^ Level 3 halted
  | EL3RST          -- ^ Level 3 reset
  | ELNRNG          -- ^ Link number out of range
  | EUNATCH         -- ^ Protocol driver not attached
  | ENOCSI          -- ^ No CSI structure available
  | EL2HLT          -- ^ Level 2 halted
  | EBADE           -- ^ Invalid exchange
  | EBADR           -- ^ Invalid request descriptor
  | EXFULL          -- ^ Exchange full
  | ENOANO          -- ^ No anode
  | EBADRQC         -- ^ Invalid request code
  | EBADSLT         -- ^ Invalid slot
  | EDEADLOCK       -- ^ (Not used: try EDEADLK)
  | EBFONT          -- ^ Bad font file format
  | ENOSTR          -- ^ Device not a stream
  | ENODATA         -- ^ No data available
  | ETIME           -- ^ Timer expired
  | ENOSR           -- ^ Out of streams resources
  | ENONET          -- ^ Machine is not on the network
  | ENOPKG          -- ^ Package not installed
  | EREMOTE         -- ^ Object is remote
  | ENOLINK         -- ^ Link has been severed
  | EADV            -- ^ Advertise error
  | ESRMNT          -- ^ Srmount error
  | ECOMM           -- ^ Communication error on send
  | EPROTO          -- ^ Protocol error
  | EMULTIHOP       -- ^ Multihop attempted
  | EDOTDOT         -- ^ RFS specific error
  | EBADMSG         -- ^ Not a data message
  | EOVERFLOW       -- ^ Value too large for defined data type
  | ENOTUNIQ        -- ^ Name not unique on network
  | EBADFD          -- ^ File descriptor in bad state
  | EREMCHG         -- ^ Remote address changed
  | ELIBACC         -- ^ Can not access a needed shared library
  | ELIBBAD         -- ^ Accessing a corrupted shared library
  | ELIBSCN         -- ^ .lib section in a.out corrupted
  | ELIBMAX         -- ^ Attempting to link in too many shared libraries
  | ELIBEXEC        -- ^ Cannot exec a shared library directly
  | EILSEQ          -- ^ Illegal byte sequence
  | ERESTART        -- ^ Interrupted system call should be restarted
  | ESTRPIPE        -- ^ Streams pipe error
  | EUSERS          -- ^ Too many users
  | ENOTSOCK        -- ^ Socket operation on non-socket
  | EDESTADDRREQ    -- ^ Destination address required
  | EMSGSIZE        -- ^ Message too long
  | EPROTOTYPE      -- ^ Protocol wrong type for socket
  | ENOPROTOOPT     -- ^ Protocol not available
  | EPROTONOSUPPORT -- ^ Protocol not supported
  | ESOCKTNOSUPPORT -- ^ Socket type not supported
  | EOPNOTSUPP      -- ^ Operation not supported on transport endpoint
  | EPFNOSUPPORT    -- ^ Protocol family not supported
  | EAFNOSUPPORT    -- ^ Address family not supported by protocol
  | EADDRINUSE      -- ^ Address already in use
  | EADDRNOTAVAIL   -- ^ Cannot assign requested address
  | ENETDOWN        -- ^ Network is down
  | ENETUNREACH     -- ^ Network is unreachable
  | ENETRESET       -- ^ Network dropped connection because of reset
  | ECONNABORTED    -- ^ Software caused connection abort
  | ECONNRESET      -- ^ Connection reset by peer
  | ENOBUFS         -- ^ No buffer space available
  | EISCONN         -- ^ Transport endpoint is already connected
  | ENOTCONN        -- ^ Transport endpoint is not connected
  | ESHUTDOWN       -- ^ Cannot send after transport endpoint shutdown
  | ETOOMANYREFS    -- ^ Too many references: cannot splice
  | ETIMEDOUT       -- ^ Connection timed out
  | ECONNREFUSED    -- ^ Connection refused
  | EHOSTDOWN       -- ^ Host is down
  | EHOSTUNREACH    -- ^ No route to host
  | EALREADY        -- ^ Operation already in progress
  | EINPROGRESS     -- ^ Operation now in progress
  | ESTALE          -- ^ Stale NFS file handle
  | EUCLEAN         -- ^ Structure needs cleaning
  | ENOTNAM         -- ^ Not a XENIX named type file
  | ENAVAIL         -- ^ No XENIX semaphores available
  | EISNAM          -- ^ Is a named type file
  | EREMOTEIO       -- ^ Remote IO error
  | EDQUOT          -- ^ Quota exceeded
  | ENOMEDIUM       -- ^ No medium found
  | EMEDIUMTYPE     -- ^ Wrong medium type
 deriving (Show,Read,Enum,Eq,Generic,Typeable)

instance Exception ErrorCode

data GrantErrorCode =
    GrantOK
  | GrantGeneralError
  | GrantBadDomain
  | GrantBadGrantRef
  | GrantBadHandle
  | GrantBadVirtualAddress
  | GrantBadDeviceAddress
  | GrantNoDeviceSpace
  | GrantPermissionDenied
  | GrantBadPage
  | GrantBadCopyArgument
  | GrantAddressTooBig
  | GrantSendAgain
 deriving (Show,Read,Enum,Eq,Generic,Typeable)

instance Exception GrantErrorCode
